package com.qf;

import com.qf.mapper.EmpMapper;
import com.qf.pojo.Emp;
import com.qf.utils.MyBatisUtils;
import org.junit.Test;

import java.util.List;

/**
 * Mybatis测试缓存
 *
 * @author lixu
 */
public class MybatisCache {

    /**
     * 一级缓存   默认是开启的
     * 存储范围是SqlSession   缓存保存在了SqlSession中了
     */
    @Test
    public void testCache1() {

        EmpMapper mapper = MyBatisUtils.getMapper(EmpMapper.class);
        //第一次查询  发出SQL语句
        List<Emp> empList1 = mapper.findAll("xixi");
        empList1.stream().forEach(System.out::println);

        System.out.println("==============================================");
        //第二次查询   发出SQL语句 但是Mybatis自带一级缓存  直接获取SqlSession一级缓存即可
        List<Emp> empList2 = mapper.findAll("xixi");
        empList2.stream().forEach(System.out::println);

    }

    /**
     * 二级缓存   同学们完成
     *     1、settings   cacheEnabled  true  默认开启的
     *     2、序列化    public class Emp implements Serializable {
     *     3、<cache/>  EmpMapper.xml  二级缓存的标签  表示使用Mybatis自已的工厂保存二级缓存数据
     *         <cache-ref namespace=""/>  : 使用第三方的缓存   EHcache（ Redis ) 分布式缓存
     * 存储范围： SqlSessionFactory   可以让多个SqlSession共用的
     */
    @Test
    public void testCache2() {
        EmpMapper mapper1 = MyBatisUtils.getMapper(EmpMapper.class);
        //第一次查询  发出SQL语句   SqlSession1
        List<Emp> empList1 = mapper1.findAll("xixi");
        empList1.stream().forEach(System.out::println);
        //关闭SqlSession  同步二级缓存中   同步工厂中
        MyBatisUtils.commit();

        System.out.println("==============================================");
        //第二次查询  发出SQL语句  SqlSession2
        EmpMapper mapper2 = MyBatisUtils.getMapper(EmpMapper.class);
        List<Emp> empList2 = mapper2.findAll("xixi");
        empList2.stream().forEach(System.out::println);
        //关闭SqlSession  同步二级缓存中   同步工厂中
        MyBatisUtils.commit();
        System.out.println("==============================================");

        EmpMapper mapper4 = MyBatisUtils.getMapper(EmpMapper.class);
        mapper4.delete(4025);
        MyBatisUtils.commit();

        System.out.println("==============================================");
        //第二次查询  发出SQL语句  SqlSession3
        EmpMapper mapper3 = MyBatisUtils.getMapper(EmpMapper.class);
        List<Emp> empList3 = mapper3.findAll("xixi");
        empList3.stream().forEach(System.out::println);
    }


}
